package com.ljy.my_study.lintcode.螺旋矩阵;

import java.util.ArrayList;
import java.util.List;

/** 
* @author James
* @date 2019年5月13日 
*/
public class TestMain {
//	给定一个包含 m x n 个要素的矩阵，（m 行, n 列），按照螺旋顺序，返回该矩阵中的所有要素。
//
//	您在真实的面试中是否遇到过这个题？  
//	样例
//	样例 1:
//
//	输入:[[ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]]
//	输出: [1,2,3,6,9,8,7,4,5]
//	样例 2
//
//	输入:[[ 6,4,1 ], [ 7,8,9 ]]
//	输出: [6,4,1,9,8,7]
	public static void main(String[] args) {
//		int[][] matrix= {{ 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }};
		int[][] matrix= {{ 6,4,1,10,16 }, { 7,8,9,11,17 },{12,13,14,15,18}};
		System.out.println(spiralOrder(matrix));
	}
	
	public static List<Integer> spiralOrder(int[][] matrix) {
		List<Integer> result=new ArrayList<>();
		if(matrix==null||matrix.length==0||matrix[0].length==0) {
			return result;
		}
		int m=0;
		int bearing=0;
		int aLen=matrix[0].length;
		int bLen=matrix.length;
		out:while(true) {
			if(m*2>=aLen||m*2>=bLen) {
				break;
			}
			switch(bearing) {
			case 0:{
				boolean flag=false;
				for(int i=m;i<aLen-m-1;i++) {
					result.add(matrix[m][i]);
					flag=true;
				}
				if(!flag) {
					break out;
				}
				bearing=1;
			};
			break;
			case 1:{
				boolean flag=false;
				for(int i=m;i<bLen-m-1;i++) {
					result.add(matrix[i][aLen-m-1]);
					flag=true;
				}
				if(!flag) {
					break out;
				}
				bearing=2;
			};
			break;
			case 2:{
				for(int i=aLen-m-1;i>m;i--) {
					result.add(matrix[bLen-m-1][i]);
				}
				bearing=3;
			};
			break;
			case 3:{
				for(int i=bLen-m-1;i>m;i--) {
					result.add(matrix[i][m]);
				}
				bearing=0;
				m++;
			};
			break;
			}
		}
		if(m==aLen-1-m&&m<=bLen-1-m) {
			for(int i=m;i<=bLen-1-m;i++) {
				result.add(matrix[i][m]);
			}
		}
		if(m==bLen-1-m&&m<=aLen-1-m) {
			for(int i=m+1;i<=aLen-1-m;i++) {
				result.add(matrix[m][i]);
			}
		}
		return result;
    }
	
}
